Code coverage report for src/binding-language.js

Statements: 84.69% (177 / 209)      Branches: 70% (70 / 100)      Functions: 89.29% (25 / 28)      Lines: 85.5% (171 / 200)      Ignored: none     

All files » src/ » binding-language.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 3771     1   59   1   1   1210   280 280 280 280 280   2   12     1 1   1 1 2   2 2 2 2 2 2 2                                         1   1       1 3   3   3                       3           3 3 3 3     3     1                                 1       1 54                 54 352 352 352   352 2812 2812 2812     272 136 136 136   272   67 67     2473 505     1968 19 1949 371       352   352 352   19 19 19 19     333 333 333 333   352 352             54 1       53   53     1     1   1 1 53   53 53 53 53 53 53 53     1 4     1     1   1 1 4   4 1 3     4 4 4 4 4 4     1 7     1 3   3 3 3 3           1 102 102     1 84   84 84 84   84 14 14 14 14 14 6 6       84 21 21 21 9     15     9   21       1 3               3 17 7 7 7   7             1 102               102 642 372   270 270       102     1 6         6 6 7       6   6 3 6       6 6 3     3   3     6     1              
System.register(['aurelia-templating', 'aurelia-binding', './syntax-interpreter', 'aurelia-logging'], function (_export) {
  'use strict';
 
  var BindingLanguage, Parser, ObserverLocator, BindingExpression, NameExpression, bindingMode, SyntaxInterpreter, LogManager, info, logger, TemplatingBindingLanguage, InterpolationBindingExpression, InterpolationBinding;
 
  function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 
  function _inherits(subClass, superClass) { Iif (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); Eif (superClass) subClass.__proto__ = superClass; }
 
  return {
    setters: [function (_aureliaTemplating) {
      BindingLanguage = _aureliaTemplating.BindingLanguage;
    }, function (_aureliaBinding) {
      Parser = _aureliaBinding.Parser;
      ObserverLocator = _aureliaBinding.ObserverLocator;
      BindingExpression = _aureliaBinding.BindingExpression;
      NameExpression = _aureliaBinding.NameExpression;
      bindingMode = _aureliaBinding.bindingMode;
    }, function (_syntaxInterpreter) {
      SyntaxInterpreter = _syntaxInterpreter.SyntaxInterpreter;
    }, function (_aureliaLogging) {
      LogManager = _aureliaLogging;
    }],
    execute: function () {
      info = {};
      logger = LogManager.getLogger('templating-binding');
 
      TemplatingBindingLanguage = (function (_BindingLanguage) {
        function TemplatingBindingLanguage(parser, observerLocator, syntaxInterpreter) {
          _classCallCheck(this, TemplatingBindingLanguage);
 
          _BindingLanguage.call(this);
          this.parser = parser;
          this.observerLocator = observerLocator;
          this.syntaxInterpreter = syntaxInterpreter;
          this.emptyStringExpression = this.parser.parse('\'\'');
          syntaxInterpreter.language = this;
          this.attributeMap = syntaxInterpreter.attributeMap = {
            'contenteditable': 'contentEditable',
            'for': 'htmlFor',
            'tabindex': 'tabIndex',
            'textcontent': 'textContent',
            'innerhtml': 'innerHTML',
            // HTMLInputElement https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement
            'maxlength': 'maxLength',
            'minlength': 'minLength',
            'formaction': 'formAction',
            'formenctype': 'formEncType',
            'formmethod': 'formMethod',
            'formnovalidate': 'formNoValidate',
            'formtarget': 'formTarget',
            'rowspan': 'rowSpan',
            'colspan': 'colSpan',
            'scrolltop': 'scrollTop',
            'scrollleft': 'scrollLeft'
          };
        }
 
        _inherits(TemplatingBindingLanguage, _BindingLanguage);
 
        TemplatingBindingLanguage.inject = function inject() {
          return [Parser, ObserverLocator, SyntaxInterpreter];
        };
 
        TemplatingBindingLanguage.prototype.inspectAttribute = function inspectAttribute(resources, attrName, attrValue) {
          var parts = attrName.split('.');
 
          info.defaultBindingMode = null;
 
          Iif (parts.length == 2) {
            info.attrName = parts[0].trim();
            info.attrValue = attrValue;
            info.command = parts[1].trim();
 
            if (info.command === 'ref') {
              info.expression = new NameExpression(attrValue, info.attrName);
              info.command = null;
              info.attrName = 'ref';
            } else {
              info.expression = null;
            }
          } else Iif (attrName == 'ref') {
            info.attrName = attrName;
            info.attrValue = attrValue;
            info.command = null;
            info.expression = new NameExpression(attrValue, 'element');
          } else {
            info.attrName = attrName;
            info.attrValue = attrValue;
            info.command = null;
            info.expression = this.parseContent(resources, attrName, attrValue);
          }
 
          return info;
        };
 
        TemplatingBindingLanguage.prototype.createAttributeInstruction = function createAttributeInstruction(resources, element, info, existingInstruction) {
          var instruction;
 
          if (info.expression) {
            if (info.attrName === 'ref') {
              return info.expression;
            }
 
            instruction = existingInstruction || { attrName: info.attrName, attributes: {} };
            instruction.attributes[info.attrName] = info.expression;
          } else if (info.command) {
            instruction = this.syntaxInterpreter.interpret(resources, element, info, existingInstruction);
          }
 
          return instruction;
        };
 
        TemplatingBindingLanguage.prototype.parseText = function parseText(resources, value) {
          return this.parseContent(resources, 'textContent', value);
        };
 
        TemplatingBindingLanguage.prototype.parseContent = function parseContent(resources, attrName, attrValue) {
          var i = attrValue.indexOf('${', 0),
              ii = attrValue.length,
              char,
              pos = 0,
              open = 0,
              quote = null,
              interpolationStart,
              parts,
              partIndex = 0;
          while (i >= 0 && i < ii - 2) {
            open = 1;
            interpolationStart = i;
            i += 2;
 
            do {
              char = attrValue[i];
              i++;
              switch (char) {
                case '\'':
                case '"':
                  if (quote === null) {
                    quote = char;
                  } else Eif (quote === char) {
                    quote = null;
                  }
                  continue;
                case '\\':
                  i++;
                  continue;
              }
 
              if (quote !== null) {
                continue;
              }
 
              if (char === '{') {
                open++;
              } else if (char === '}') {
                open--;
              }
            } while (open > 0 && i < ii);
 
            Eif (open === 0) {
              // lazy allocate array
              parts = parts || [];
              if (attrValue[interpolationStart - 1] === '\\' && attrValue[interpolationStart - 2] !== '\\') {
                // escaped interpolation
                parts[partIndex] = attrValue.substring(pos, interpolationStart - 1) + attrValue.substring(interpolationStart, i);
                partIndex++;
                parts[partIndex] = this.emptyStringExpression;
                partIndex++;
              } else {
                // standard interpolation
                parts[partIndex] = attrValue.substring(pos, interpolationStart);
                partIndex++;
                parts[partIndex] = this.parser.parse(attrValue.substring(interpolationStart + 2, i - 1));
                partIndex++;
              }
              pos = i;
              i = attrValue.indexOf('${', i);
            } else {
              break;
            }
          }
 
          // no interpolation.
          if (partIndex === 0) {
            return null;
          }
 
          // literal.
          parts[partIndex] = attrValue.substr(pos);
 
          return new InterpolationBindingExpression(this.observerLocator, this.attributeMap[attrName] || attrName, parts, bindingMode.oneWay, resources.valueConverterLookupFunction, attrName);
        };
 
        return TemplatingBindingLanguage;
      })(BindingLanguage);
 
      _export('TemplatingBindingLanguage', TemplatingBindingLanguage);
 
      InterpolationBindingExpression = (function () {
        function InterpolationBindingExpression(observerLocator, targetProperty, parts, mode, valueConverterLookupFunction, attribute) {
          _classCallCheck(this, InterpolationBindingExpression);
 
          this.observerLocator = observerLocator;
          this.targetProperty = targetProperty;
          this.parts = parts;
          this.mode = mode;
          this.valueConverterLookupFunction = valueConverterLookupFunction;
          this.attribute = attribute;
          this.discrete = false;
        }
 
        InterpolationBindingExpression.prototype.createBinding = function createBinding(target) {
          return new InterpolationBinding(this.observerLocator, this.parts, target, this.targetProperty, this.mode, this.valueConverterLookupFunction);
        };
 
        return InterpolationBindingExpression;
      })();
 
      _export('InterpolationBindingExpression', InterpolationBindingExpression);
 
      InterpolationBinding = (function () {
        function InterpolationBinding(observerLocator, parts, target, targetProperty, mode, valueConverterLookupFunction) {
          _classCallCheck(this, InterpolationBinding);
 
          if (targetProperty === 'style') {
            logger.info('Internet Explorer does not support interpolation in "style" attributes.  Use the style attribute\'s alias, "css" instead.');
          } else Iif (target.parentElement && target.parentElement.nodeName === 'TEXTAREA' && targetProperty === 'textContent') {
            throw new Error('Interpolation binding cannot be used in the content of a textarea element.  Use <textarea value.bind="expression"></textarea> instead.');
          }
          this.observerLocator = observerLocator;
          this.parts = parts;
          this.targetProperty = observerLocator.getObserver(target, targetProperty);
          this.mode = mode;
          this.valueConverterLookupFunction = valueConverterLookupFunction;
          this.toDispose = [];
        }
 
        InterpolationBinding.prototype.getObserver = function getObserver(obj, propertyName) {
          return this.observerLocator.getObserver(obj, propertyName);
        };
 
        InterpolationBinding.prototype.bind = function bind(source) {
          this.source = source;
 
          Eif (this.mode == bindingMode.oneWay) {
            this.unbind();
            this.connect();
            this.setValue();
          } else {
            this.setValue();
          }
        };
 
        InterpolationBinding.prototype.setValue = function setValue() {
          var value = this.interpolate();
          this.targetProperty.setValue(value);
        };
 
        InterpolationBinding.prototype.partChanged = function partChanged(newValue, oldValue, connecting) {
          var _this = this;
 
          var map, info;
          Eif (!connecting) {
            this.setValue();
          }
          if (oldValue instanceof Array) {
            map = this.arrayPartMap;
            info = map ? map.get(oldValue) : null;
            Eif (info) {
              info.refs--;
              if (info.refs === 0) {
                info.dispose();
                map['delete'](oldValue);
              }
            }
          }
          if (newValue instanceof Array) {
            map = this.arrayPartMap || (this.arrayPartMap = new Map());
            info = map.get(newValue);
            if (!info) {
              info = {
                refs: 0,
                dispose: this.observerLocator.getArrayObserver(newValue).subscribe(function () {
                  return _this.setValue();
                })
              };
              map.set(newValue, info);
            }
            info.refs++;
          }
        };
 
        InterpolationBinding.prototype.connect = function connect() {
          var info,
              parts = this.parts,
              source = this.source,
              toDispose = this.toDispose = [],
              partChanged = this.partChanged.bind(this),
              i,
              ii;
 
          for (i = 0, ii = parts.length; i < ii; ++i) {
            if (i % 2 === 0) {} else {
              info = parts[i].connect(this, source);
              Eif (info.observer) {
                toDispose.push(info.observer.subscribe(partChanged));
              }
              Iif (info.value instanceof Array) {
                partChanged(info.value, undefined, true);
              }
            }
          }
        };
 
        InterpolationBinding.prototype.interpolate = function interpolate() {
          var value = '',
              parts = this.parts,
              source = this.source,
              valueConverterLookupFunction = this.valueConverterLookupFunction,
              i,
              ii,
              temp;
 
          for (i = 0, ii = parts.length; i < ii; ++i) {
            if (i % 2 === 0) {
              value += parts[i];
            } else {
              temp = parts[i].evaluate(source, valueConverterLookupFunction);
              value += typeof temp !== 'undefined' && temp !== null ? temp.toString() : '';
            }
          }
 
          return value;
        };
 
        InterpolationBinding.prototype.unbind = function unbind() {
          var i,
              ii,
              toDispose = this.toDispose,
              map = this.arrayPartMap;
 
          Eif (toDispose) {
            for (i = 0, ii = toDispose.length; i < ii; ++i) {
              toDispose[i]();
            }
          }
 
          this.toDispose = null;
 
          if (map) {
            for (var _iterator = map.values(), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
              Iif (_isArray) {
                if (_i >= _iterator.length) break;
                toDispose = _iterator[_i++];
              } else {
                _i = _iterator.next();
                if (_i.done) break;
                toDispose = _i.value;
              }
 
              toDispose.dispose();
            }
            map.clear();
          }
 
          this.arrayPartMap = null;
        };
 
        return InterpolationBinding;
      })();
    }
  };
});
 
//do nothing
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL3RlbXBsYXRpbmctYmluZGluZy9zcmMvYmluZGluZy1sYW5ndWFnZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7K0hBS0ksSUFBSSxFQUNKLE1BQU0sRUFFRyx5QkFBeUIsRUF1S3pCLDhCQUE4QixFQXdCckMsb0JBQW9COzs7Ozs7OzsyQ0F2TWxCLGVBQWU7OytCQUNmLE1BQU07d0NBQUUsZUFBZTswQ0FBRSxpQkFBaUI7dUNBQUUsY0FBYztvQ0FBRSxXQUFXOzs2Q0FDdkUsaUJBQWlCOzs7OztBQUdyQixVQUFJLEdBQUcsRUFBRTtBQUNULFlBQU0sR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDOztBQUUxQywrQkFBeUI7QUFFMUIsaUJBRkMseUJBQXlCLENBRXpCLE1BQU0sRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUM7Z0NBRjNDLHlCQUF5Qjs7QUFHbEMscUNBQU8sQ0FBQztBQUNSLGNBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ3JCLGNBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO0FBQ3ZDLGNBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztBQUMzQyxjQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdkQsMkJBQWlCLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztBQUNsQyxjQUFJLENBQUMsWUFBWSxHQUFHLGlCQUFpQixDQUFDLFlBQVksR0FBRztBQUNuRCw2QkFBaUIsRUFBQyxpQkFBaUI7QUFDbkMsaUJBQUssRUFBQyxTQUFTO0FBQ2Ysc0JBQVUsRUFBQyxVQUFVO0FBQ3JCLHlCQUFhLEVBQUUsYUFBYTtBQUM1Qix1QkFBVyxFQUFFLFdBQVc7O0FBRXhCLHVCQUFXLEVBQUMsV0FBVztB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UUFBUSxFQUFFLEdBQUcsRUFBRSxBQUFDLENBQUM7YUFDaEY7V0FDRjs7QUFFRCxpQkFBTyxLQUFLLENBQUM7U0FDZDs7QUExR0csNEJBQW9CLFdBNEd4QixNQUFNLEdBQUEsa0JBQUU7QUFDTixjQUFJLENBQUM7Y0FBRSxFQUFFO2NBQUUsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTO2NBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7O0FBRS9ELGNBQUcsU0FBUyxFQUFDO0FBQ1gsaUJBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFDO0FBQzVDLHVCQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNoQjtXQUNGOztBQUVELGNBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDOztBQUV0QixjQUFJLEdBQUcsRUFBRTtBQUNQLGlDQUFpQixHQUFHLENBQUMsTUFBTSxFQUFFLGtIQUFFOzs7QUFBM0IseUJBQVM7Ozs7QUFBVCx5QkFBUzs7O0FBQ1gsdUJBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUNyQjtBQUNELGVBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztXQUNiOztBQUVELGNBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1NBQzFCOztlQS9IRyxvQkFBb0IiLCJmaWxlIjoiL1VzZXJzL0Vpc2VuYmVyZ0VmZmVjdC9Eb2N1bWVudHMvR2l0SHViL1RoZSBEdXJhbmRhbCBQcm9qZWN0L2F1cmVsaWEvdGVtcGxhdGluZy1iaW5kaW5nL3NyYy9iaW5kaW5nLWxhbmd1YWdlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtCaW5kaW5nTGFuZ3VhZ2V9IGZyb20gJ2F1cmVsaWEtdGVtcGxhdGluZyc7XG5pbXBvcnQge1BhcnNlciwgT2JzZXJ2ZXJMb2NhdG9yLCBCaW5kaW5nRXhwcmVzc2lvbiwgTmFtZUV4cHJlc3Npb24sIGJpbmRpbmdNb2RlfSBmcm9tICdhdXJlbGlhLWJpbmRpbmcnO1xuaW1wb3J0IHtTeW50YXhJbnRlcnByZXRlcn0gZnJvbSAnLi9zeW50YXgtaW50ZXJwcmV0ZXInO1xuaW1wb3J0ICogYXMgTG9nTWFuYWdlciBmcm9tICdhdXJlbGlhLWxvZ2dpbmcnO1xuXG52YXIgaW5mbyA9IHt9LFxuICAgIGxvZ2dlciA9IExvZ01hbmFnZXIuZ2V0TG9nZ2VyKCd0ZW1wbGF0aW5nLWJpbmRpbmcnKTtcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRpbmdCaW5kaW5nTGFuZ3VhZ2UgZXh0ZW5kcyBCaW5kaW5nTGFuZ3VhZ2Uge1xuICBzdGF0aWMgaW5qZWN0KCkgeyByZXR1cm4gW1BhcnNlciwgT2JzZXJ2ZXJMb2NhdG9yLCBTeW50YXhJbnRlcnByZXRlcl07IH1cblx0Y29uc3RydWN0b3IocGFyc2VyLCBvYnNlcnZlckxvY2F0b3IsIHN5bnRheEludGVycHJldGVyKXtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgIHRoaXMub2JzZXJ2ZXJMb2NhdG9yID0gb2JzZXJ2ZXJMb2NhdG9yO1xuICAgIHRoaXMuc3ludGF4SW50ZXJwcmV0ZXIgPSBzeW50YXhJbnRlcnByZXRlcjtcbiAgICB0aGlzLmVtcHR5U3RyaW5nRXhwcmVzc2lvbiA9IHRoaXMucGFyc2VyLnBhcnNlKCdcXCdcXCcnKTtcbiAgICBzeW50YXhJbnRlcnByZXRlci5sYW5ndWFnZSA9IHRoaXM7XG4gICAgdGhpcy5hdHRyaWJ1dGVNYXAgPSBzeW50YXhJbnRlcnByZXRlci5hdHRyaWJ1dGVNYXAgPSB7XG4gICAgICAnY29udGVudGVkaXRhYmxlJzonY29udGVudEVkaXRhYmxlJyxcbiAgICAgICdmb3InOidodG1sRm9yJyxcbiAgICAgICd0YWJpbmRleCc6J3RhYkluZGV4JyxcbiAgICAgICd0ZXh0Y29udGVudCc6ICd0ZXh0Q29udGVudCcsXG4gICAgICAnaW5uZXJodG1sJzogJ2lubmVySFRNTCcsXG4gICAgICAvLyBIVE1MSW5wdXRFbGVtZW50IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MSW5wdXRFbGVtZW50XG4gICAgICAnbWF4bGVuZ3RoJzonbWF4TGVuZ3RoJyxcbiAgICAgICdtaW5sZW5ndGgnOidtaW5MZW5ndGgnLFxuICAgICAgJ2Zvcm1hY3Rpb24nOidmb3JtQWN0aW9uJyxcbiAgICAgICdmb3JtZW5jdHlwZSc6J2Zvcm1FbmNUeXBlJyxcbiAgICAgICdmb3JtbWV0aG9kJzonZm9ybU1ldGhvZCcsXG4gICAgICAnZm9ybW5vdmFsaWRhdGUnOidmb3JtTm9WYWxpZGF0ZScsXG4gICAgICAnZm9ybXRhcmdldCc6J2Zvcm1UYXJnZXQnLFxuICAgICAgJ3Jvd3NwYW4nOidyb3dTcGFuJyxcbiAgICAgICdjb2xzcGFuJzonY29sU3BhbicsXG4gICAgICAnc2Nyb2xsdG9wJzonc2Nyb2xsVG9wJyxcbiAgICAgICdzY3JvbGxsZWZ0Jzonc2Nyb2xsTGVmdCdcbiAgICB9O1xuICB9XG5cbiAgaW5zcGVjdEF0dHJpYnV0ZShyZXNvdXJjZXMsIGF0dHJOYW1lLCBhdHRyVmFsdWUpe1xuICAgIHZhciBwYXJ0cyA9IGF0dHJOYW1lLnNwbGl0KCcuJyk7XG5cbiAgICBpbmZvLmRlZmF1bHRCaW5kaW5nTW9kZSA9IG51bGw7XG5cbiAgICBpZihwYXJ0cy5sZW5ndGggPT0gMil7XG4gICAgICBpbmZvLmF0dHJOYW1lID0gcGFydHNbMF0udHJpbSgpO1xuICAgICAgaW5mby5hdHRyVmFsdWUgPSBhdHRyVmFsdWU7XG4gICAgICBpbmZvLmNvbW1hbmQgPSBwYXJ0c1sxXS50cmltKCk7XG5cbiAgICAgIGlmKGluZm8uY29tbWFuZCA9PT0gJ3JlZicpe1xuICAgICAgICBpbmZvLmV4cHJlc3Npb24gPSBuZXcgTmFtZUV4cHJlc3Npb24oYXR0clZhbHVlLCBpbmZvLmF0dHJOYW1lKTtcbiAgICAgICAgaW5mby5jb21tYW5kID0gbnVsbDtcbiAgICAgICAgaW5mby5hdHRyTmFtZSA9ICdyZWYnO1xuICAgICAgfSBlbHNle1xuICAgICAgICBpbmZvLmV4cHJlc3Npb24gPSBudWxsO1xuICAgICAgfVxuICAgIH1lbHNlIGlmKGF0dHJOYW1lID09ICdyZWYnKXtcbiAgICAgIGluZm8uYXR0ck5hbWUgPSBhdHRyTmFtZTtcbiAgICAgIGluZm8uYXR0clZhbHVlID0gYXR0clZhbHVlO1xuICAgICAgaW5mby5jb21tYW5kID0gbnVsbDtcbiAgICAgIGluZm8uZXhwcmVzc2lvbiA9IG5ldyBOYW1lRXhwcmVzc2lvbihhdHRyVmFsdWUsICdlbGVtZW50Jyk7XG4gICAgfWVsc2V7XG4gICAgICBpbmZvLmF0dHJOYW1lID0gYXR0ck5hbWU7XG4gICAgICBpbmZvLmF0dHJWYWx1ZSA9IGF0dHJWYWx1ZTtcbiAgICAgIGluZm8uY29tbWFuZCA9IG51bGw7XG4gICAgICBpbmZvLmV4cHJlc3Npb24gPSB0aGlzLnBhcnNlQ29udGVudChyZXNvdXJjZXMsIGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiBpbmZvO1xuICB9XG5cblx0Y3JlYXRlQXR0cmlidXRlSW5zdHJ1Y3Rpb24ocmVzb3VyY2VzLCBlbGVtZW50LCBpbmZvLCBleGlzdGluZ0luc3RydWN0aW9uKXtcbiAgICB2YXIgaW5zdHJ1Y3Rpb247XG5cbiAgICBpZihpbmZvLmV4cHJlc3Npb24pe1xuICAgICAgaWYoaW5mby5hdHRyTmFtZSA9PT0gJ3JlZicpe1xuICAgICAgICByZXR1cm4gaW5mby5leHByZXNzaW9uO1xuICAgICAgfVxuXG4gICAgICBpbnN0cnVjdGlvbiA9IGV4aXN0aW5nSW5zdHJ1Y3Rpb24gfHwge2F0dHJOYW1lOmluZm8uYXR0ck5hbWUsIGF0dHJpYnV0ZXM6e319O1xuICAgICAgaW5zdHJ1Y3Rpb24uYXR0cmlidXRlc1tpbmZvLmF0dHJOYW1lXSA9IGluZm8uZXhwcmVzc2lvbjtcbiAgICB9IGVsc2UgaWYoaW5mby5jb21tYW5kKXtcbiAgICAgIGluc3RydWN0aW9uID0gdGhpcy5zeW50YXhJbnRlcnByZXRlci5pbnRlcnByZXQoXG4gICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgaW5mbyxcbiAgICAgICAgZXhpc3RpbmdJbnN0cnVjdGlvblxuICAgICAgKTtcbiAgICB9XG5cblx0XHRyZXR1cm4gaW5zdHJ1Y3Rpb247XG5cdH1cblxuICBwYXJzZVRleHQocmVzb3VyY2VzLCB2YWx1ZSl7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VDb250ZW50KHJlc291cmNlcywgJ3RleHRDb250ZW50JywgdmFsdWUpO1xuICB9XG5cbiAgcGFyc2VDb250ZW50KHJlc291cmNlcywgYXR0ck5hbWUsIGF0dHJWYWx1ZSl7XG4gICAgdmFyIGkgPSBhdHRyVmFsdWUuaW5kZXhPZignJHsnLCAwKSwgaWkgPSBhdHRyVmFsdWUubGVuZ3RoLFxuICAgICAgICBjaGFyLCBwb3MgPSAwLCBvcGVuID0gMCwgcXVvdGUgPSBudWxsLCBpbnRlcnBvbGF0aW9uU3RhcnQsXG4gICAgICAgIHBhcnRzLCBwYXJ0SW5kZXggPSAwO1xuICAgIHdoaWxlKGkgPj0gMCAmJiBpIDwgaWkgLSAyKSB7XG4gICAgICBvcGVuID0gMTtcbiAgICAgIGludGVycG9sYXRpb25TdGFydCA9IGk7XG4gICAgICBpICs9IDI7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgY2hhciA9IGF0dHJWYWx1ZVtpXTtcbiAgICAgICAgaSsrO1xuICAgICAgICBzd2l0Y2goY2hhcikge1xuICAgICAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgICAgY2FzZSAnXCInOlxuICAgICAgICAgICAgaWYgKHF1b3RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHF1b3RlID0gY2hhcjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocXVvdGUgPT09IGNoYXIpIHtcbiAgICAgICAgICAgICAgcXVvdGUgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgY2FzZSAnXFxcXCc6XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChxdW90ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYXIgPT09ICd7Jykge1xuICAgICAgICAgIG9wZW4rKztcbiAgICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnfScpIHtcbiAgICAgICAgICBvcGVuLS07XG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUob3BlbiA+IDAgJiYgaSA8IGlpKVxuXG4gICAgICBpZiAob3BlbiA9PT0gMCkge1xuICAgICAgICAvLyBsYXp5IGFsbG9jYXRlIGFycmF5XG4gICAgICAgIHBhcnRzID0gcGFydHMgfHwgW107XG4gICAgICAgIGlmIChhdHRyVmFsdWVbaW50ZXJwb2xhdGlvblN0YXJ0IC0gMV0gPT09ICdcXFxcJyAmJiBhdHRyVmFsdWVbaW50ZXJwb2xhdGlvblN0YXJ0IC0gMl0gIT09ICdcXFxcJykge1xuICAgICAgICAgIC8vIGVzY2FwZWQgaW50ZXJwb2xhdGlvblxuICAgICAgICAgIHBhcnRzW3BhcnRJbmRleF0gPSBhdHRyVmFsdWUuc3Vic3RyaW5nKHBvcywgaW50ZXJwb2xhdGlvblN0YXJ0IC0gMSkgKyBhdHRyVmFsdWUuc3Vic3RyaW5nKGludGVycG9sYXRpb25TdGFydCwgaSk7XG4gICAgICAgICAgcGFydEluZGV4Kys7XG4gICAgICAgICAgcGFydHNbcGFydEluZGV4XSA9IHRoaXMuZW1wdHlTdHJpbmdFeHByZXNzaW9uO1xuICAgICAgICAgIHBhcnRJbmRleCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHN0YW5kYXJkIGludGVycG9sYXRpb25cbiAgICAgICAgICBwYXJ0c1twYXJ0SW5kZXhdID0gYXR0clZhbHVlLnN1YnN0cmluZyhwb3MsIGludGVycG9sYXRpb25TdGFydCk7XG4gICAgICAgICAgcGFydEluZGV4Kys7XG4gICAgICAgICAgcGFydHNbcGFydEluZGV4XSA9IHRoaXMucGFyc2VyLnBhcnNlKGF0dHJWYWx1ZS5zdWJzdHJpbmcoaW50ZXJwb2xhdGlvblN0YXJ0ICsgMiwgaSAtIDEpKTtcbiAgICAgICAgICBwYXJ0SW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSBpO1xuICAgICAgICBpID0gYXR0clZhbHVlLmluZGV4T2YoJyR7JywgaSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBubyBpbnRlcnBvbGF0aW9uLlxuICAgIGlmIChwYXJ0SW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIGxpdGVyYWwuXG4gICAgcGFydHNbcGFydEluZGV4XSA9IGF0dHJWYWx1ZS5zdWJzdHIocG9zKTtcblxuICAgIHJldHVybiBuZXcgSW50ZXJwb2xhdGlvbkJpbmRpbmdFeHByZXNzaW9uKFxuICAgICAgdGhpcy5vYnNlcnZlckxvY2F0b3IsXG4gICAgICB0aGlzLmF0dHJpYnV0ZU1hcFthdHRyTmFtZV0gfHwgYXR0ck5hbWUsXG4gICAgICBwYXJ0cyxcbiAgICAgIGJpbmRpbmdNb2RlLm9uZVdheSxcbiAgICAgIHJlc291cmNlcy52YWx1ZUNvbnZlcnRlckxvb2t1cEZ1bmN0aW9uLFxuICAgICAgYXR0ck5hbWVcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnRlcnBvbGF0aW9uQmluZGluZ0V4cHJlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihvYnNlcnZlckxvY2F0b3IsIHRhcmdldFByb3BlcnR5LCBwYXJ0cyxcbiAgICBtb2RlLCB2YWx1ZUNvbnZlcnRlckxvb2t1cEZ1bmN0aW9uLCBhdHRyaWJ1dGUpe1xuICAgIHRoaXMub2JzZXJ2ZXJMb2NhdG9yID0gb2JzZXJ2ZXJMb2NhdG9yO1xuICAgIHRoaXMudGFyZ2V0UHJvcGVydHkgPSB0YXJnZXRQcm9wZXJ0eTtcbiAgICB0aGlzLnBhcnRzID0gcGFydHM7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICB0aGlzLnZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb24gPSB2YWx1ZUNvbnZlcnRlckxvb2t1cEZ1bmN0aW9uO1xuICAgIHRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlO1xuICAgIHRoaXMuZGlzY3JldGUgPSBmYWxzZTtcbiAgfVxuXG4gIGNyZWF0ZUJpbmRpbmcodGFyZ2V0KXtcbiAgICByZXR1cm4gbmV3IEludGVycG9sYXRpb25CaW5kaW5nKFxuICAgICAgdGhpcy5vYnNlcnZlckxvY2F0b3IsXG4gICAgICB0aGlzLnBhcnRzLFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy50YXJnZXRQcm9wZXJ0eSxcbiAgICAgIHRoaXMubW9kZSxcbiAgICAgIHRoaXMudmFsdWVDb252ZXJ0ZXJMb29rdXBGdW5jdGlvblxuICAgICAgKTtcbiAgfVxufVxuXG5jbGFzcyBJbnRlcnBvbGF0aW9uQmluZGluZyB7XG4gIGNvbnN0cnVjdG9yKG9ic2VydmVyTG9jYXRvciwgcGFydHMsIHRhcmdldCwgdGFyZ2V0UHJvcGVydHksIG1vZGUsIHZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb24pe1xuICAgIGlmICh0YXJnZXRQcm9wZXJ0eSA9PT0gJ3N0eWxlJykge1xuICAgICAgbG9nZ2VyLmluZm8oJ0ludGVybmV0IEV4cGxvcmVyIGRvZXMgbm90IHN1cHBvcnQgaW50ZXJwb2xhdGlvbiBpbiBcInN0eWxlXCIgYXR0cmlidXRlcy4gIFVzZSB0aGUgc3R5bGUgYXR0cmlidXRlXFwncyBhbGlhcywgXCJjc3NcIiBpbnN0ZWFkLicpO1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0LnBhcmVudEVsZW1lbnQgJiYgdGFyZ2V0LnBhcmVudEVsZW1lbnQubm9kZU5hbWUgPT09ICdURVhUQVJFQScgJiYgdGFyZ2V0UHJvcGVydHkgPT09ICd0ZXh0Q29udGVudCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW50ZXJwb2xhdGlvbiBiaW5kaW5nIGNhbm5vdCBiZSB1c2VkIGluIHRoZSBjb250ZW50IG9mIGEgdGV4dGFyZWEgZWxlbWVudC4gIFVzZSA8dGV4dGFyZWEgdmFsdWUuYmluZD1cImV4cHJlc3Npb25cIj48L3RleHRhcmVhPiBpbnN0ZWFkLicpO1xuICAgIH1cbiAgICB0aGlzLm9ic2VydmVyTG9jYXRvciA9IG9ic2VydmVyTG9jYXRvcjtcbiAgICB0aGlzLnBhcnRzID0gcGFydHM7XG4gICAgdGhpcy50YXJnZXRQcm9wZXJ0eSA9IG9ic2VydmVyTG9jYXRvci5nZXRPYnNlcnZlcih0YXJnZXQsIHRhcmdldFByb3BlcnR5KTtcbiAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgIHRoaXMudmFsdWVDb252ZXJ0ZXJMb29rdXBGdW5jdGlvbiA9IHZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb247XG4gICAgdGhpcy50b0Rpc3Bvc2UgPSBbXTtcbiAgfVxuXG4gIGdldE9ic2VydmVyKG9iaiwgcHJvcGVydHlOYW1lKXtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlckxvY2F0b3IuZ2V0T2JzZXJ2ZXIob2JqLCBwcm9wZXJ0eU5hbWUpO1xuICB9XG5cbiAgYmluZChzb3VyY2Upe1xuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXG4gICAgaWYodGhpcy5tb2RlID09IGJpbmRpbmdNb2RlLm9uZVdheSl7XG4gICAgICB0aGlzLnVuYmluZCgpO1xuICAgICAgdGhpcy5jb25uZWN0KCk7XG4gICAgICB0aGlzLnNldFZhbHVlKCk7XG4gICAgfWVsc2V7XG4gICAgICB0aGlzLnNldFZhbHVlKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0VmFsdWUoKXtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLmludGVycG9sYXRlKCk7XG4gICAgdGhpcy50YXJnZXRQcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBwYXJ0Q2hhbmdlZChuZXdWYWx1ZSwgb2xkVmFsdWUsIGNvbm5lY3Rpbmcpe1xuICAgIHZhciBtYXAsIGluZm87XG4gICAgaWYgKCFjb25uZWN0aW5nKSB7XG4gICAgICB0aGlzLnNldFZhbHVlKCk7XG4gICAgfVxuICAgIGlmIChvbGRWYWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBtYXAgPSB0aGlzLmFycmF5UGFydE1hcDtcbiAgICAgIGluZm8gPSBtYXAgPyBtYXAuZ2V0KG9sZFZhbHVlKSA6IG51bGw7XG4gICAgICBpZiAoaW5mbykge1xuICAgICAgICBpbmZvLnJlZnMtLTtcbiAgICAgICAgaWYgKGluZm8ucmVmcyA9PT0gMCkge1xuICAgICAgICAgIGluZm8uZGlzcG9zZSgpO1xuICAgICAgICAgIG1hcC5kZWxldGUob2xkVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBtYXAgPSB0aGlzLmFycmF5UGFydE1hcCB8fCAodGhpcy5hcnJheVBhcnRNYXAgPSBuZXcgTWFwKCkpO1xuICAgICAgaW5mbyA9IG1hcC5nZXQobmV3VmFsdWUpO1xuICAgICAgaWYgKCFpbmZvKSB7XG4gICAgICAgIGluZm8gPSB7XG4gICAgICAgICAgcmVmczogMCxcbiAgICAgICAgICBkaXNwb3NlOiB0aGlzLm9ic2VydmVyTG9jYXRvci5nZXRBcnJheU9ic2VydmVyKG5ld1ZhbHVlKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZXRWYWx1ZSgpKVxuICAgICAgICB9XG4gICAgICAgIG1hcC5zZXQobmV3VmFsdWUsIGluZm8pO1xuICAgICAgfVxuICAgICAgaW5mby5yZWZzKys7XG4gICAgfVxuICB9XG5cbiAgY29ubmVjdCgpe1xuICAgIHZhciBpbmZvLFxuICAgICAgICBwYXJ0cyA9IHRoaXMucGFydHMsXG4gICAgICAgIHNvdXJjZSA9IHRoaXMuc291cmNlLFxuICAgICAgICB0b0Rpc3Bvc2UgPSB0aGlzLnRvRGlzcG9zZSA9IFtdLFxuICAgICAgICBwYXJ0Q2hhbmdlZCA9IHRoaXMucGFydENoYW5nZWQuYmluZCh0aGlzKSxcbiAgICAgICAgaSwgaWk7XG5cbiAgICBmb3IoaSA9IDAsIGlpID0gcGFydHMubGVuZ3RoOyBpIDwgaWk7ICsraSl7XG4gICAgICBpZiAoaSAlIDIgPT09IDApIHtcbiAgICAgICAgLy9kbyBub3RoaW5nXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmZvID0gcGFydHNbaV0uY29ubmVjdCh0aGlzLCBzb3VyY2UpO1xuICAgICAgICBpZihpbmZvLm9ic2VydmVyKXtcbiAgICAgICAgICB0b0Rpc3Bvc2UucHVzaChpbmZvLm9ic2VydmVyLnN1YnNjcmliZShwYXJ0Q2hhbmdlZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmZvLnZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICBwYXJ0Q2hhbmdlZChpbmZvLnZhbHVlLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaW50ZXJwb2xhdGUoKXtcbiAgICB2YXIgdmFsdWUgPSAnJyxcbiAgICAgICAgcGFydHMgPSB0aGlzLnBhcnRzLFxuICAgICAgICBzb3VyY2UgPSB0aGlzLnNvdXJjZSxcbiAgICAgICAgdmFsdWVDb252ZXJ0ZXJMb29rdXBGdW5jdGlvbiA9IHRoaXMudmFsdWVDb252ZXJ0ZXJMb29rdXBGdW5jdGlvbixcbiAgICAgICAgaSwgaWksIHRlbXA7XG5cbiAgICBmb3IoaSA9IDAsIGlpID0gcGFydHMubGVuZ3RoOyBpIDwgaWk7ICsraSl7XG4gICAgICBpZiAoaSAlIDIgPT09IDApIHtcbiAgICAgICAgdmFsdWUgKz0gcGFydHNbaV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZW1wID0gcGFydHNbaV0uZXZhbHVhdGUoc291cmNlLCB2YWx1ZUNvbnZlcnRlckxvb2t1cEZ1bmN0aW9uKTtcbiAgICAgICAgdmFsdWUgKz0gKHR5cGVvZiB0ZW1wICE9PSAndW5kZWZpbmVkJyAmJiB0ZW1wICE9PSBudWxsID8gdGVtcC50b1N0cmluZygpIDogJycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHVuYmluZCgpe1xuICAgIHZhciBpLCBpaSwgdG9EaXNwb3NlID0gdGhpcy50b0Rpc3Bvc2UsIG1hcCA9IHRoaXMuYXJyYXlQYXJ0TWFwO1xuXG4gICAgaWYodG9EaXNwb3NlKXtcbiAgICAgIGZvcihpID0gMCwgaWkgPSB0b0Rpc3Bvc2UubGVuZ3RoOyBpIDwgaWk7ICsraSl7XG4gICAgICAgIHRvRGlzcG9zZVtpXSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudG9EaXNwb3NlID0gbnVsbDtcblxuICAgIGlmIChtYXApIHtcbiAgICAgIGZvcih0b0Rpc3Bvc2Ugb2YgbWFwLnZhbHVlcygpKSB7XG4gICAgICAgIHRvRGlzcG9zZS5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgICBtYXAuY2xlYXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLmFycmF5UGFydE1hcCA9IG51bGw7XG4gIH1cbn1cbiJdfQ==